iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Software Development

埋藏在後端工程下的地雷與寶藏系列 第 25

Day-25 | Database - 刪除資料的差別 feat. TRUNCATE, DELETE, DROP

  • 分享至 

  • xImage
  •  

昨天在一個地方剛好看到三者的對比,今天就來比較一下三個 DB 刪除資料的方式

TRUNCATE vs. DELETE vs. DROP

在管理資料庫時,針對表(table)進行刪除資料的操作是算是很常遇到的需求。針對不同情境,SQL 提供了三個常見的指令也就是:TRUNCATE、DELETE 和 DROP。這三者的功能看似相近,但在使用上卻有很大的不同

TRUNCATE TABLE

TRUNCATE TABLE 是一個用來快速清空 table 資料的指令。它不會逐行刪除資料,會直接釋放表中的所有空間,並保留 table 的欄位結構。因為直接清空,一般來說,速度比 delete 還快。
像是我們之前有提到 Postgresql 的 VACUUM 機制,如果使用 TRUNCATE 就不用再執行 VACUUM,他會直接釋放出空間。

TRUNCATE TABLE table_name;
  • 特點
    • 速度快:不會逐行刪除,直接重置 table的資料,因此對於大量資料的 table 來說,執行效率非常高。
    • 不觸發 trigger:TRUNCATE 不會觸發任何 trigger,因為它是直接重置 table 的方式。如果不知道 trigger 可以參考此文章
    • 重置 increment id:在某些資料庫中,TRUNCATE 會重置 table 的 AUTO_INCREMENT 的 counter,刪除後再插入資料時,id 從 1 開始。
    • 無法選擇:無法像 DELETE 一樣有選擇性地刪除資料,它會清空整個 table。
  • 使用時機
    • 需要清空 table 中的所有資料。

DELETE

DELETE 是用來逐行刪除 table 中的資料的,它的靈活性較高,可以根據 WHERE 條件選擇性地刪除特定的行,並保留 table 的欄位結構。delete 如果是使用 Postgrsql 的話,不會立刻釋放出空間。

DELETE FROM table_name WHERE condition;
  • 特點
  • 逐行刪除:只刪除符合條件的資料。
    • 觸發 trigger:DELETE 操作會觸發與 table 相關的觸發器,因此可以在刪除時執行一些額外的邏輯。
    • 保留 table 結構:刪除後,table 的結構、索引等不會被改變。
    • 操作靈活:可以加上 WHERE 條件,來有選擇地刪除資料。
  • 使用時機
    • 只想刪除部分資料,且需要精細控制刪除範圍。
    • 需要觸發刪除時的相關邏輯。

DROP TABLE

DROP TABLE 用來刪除整個 table 及其相關的所有內容。這個命令將刪除 table 結構、資料、索引以及所有關聯資料。執行 DROP 後,table 將完全從資料庫中移除。

DROP TABLE table_name;
  • 特點
    • 永久刪除 table:DROP 操作會永久刪除 table 及其所有內容。
    • 刪除 table 結構:table 的結構、資料、索引等全部都會刪除。
    • 操作不可恢復:執行後,table 無法直接恢復,除非事先有備份。
  • 使用時機
    • 不再需要該 table,且希望永久刪除該 table 及其所有資料和結構。

最後表格統整一下

功能 TRUNCATE TABLE DELETE DROP TABLE
資料刪除方式 清空 table 逐行刪除 完全刪除 table
刪除條件 無法加條件 可以加 WHERE 條件 無條件,直接刪除
速度 高效 取決於資料量和條件 高效
Increment ID 重置 可能重置 不重置 無效
table 結構改變
trigger 觸發

上一篇
Day-24 | 自動化部署的好朋友 Ansible(2) - 簡單部署 MySQL 服務
下一篇
Day-26 | Python - Pydantic
系列文
埋藏在後端工程下的地雷與寶藏30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言